package com.example.myweb.Service.Auth;

import com.example.myweb.Domain.Entity.Article;
import com.example.myweb.Domain.Entity.User;

import com.example.myweb.Dto.*;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.transaction.annotation.Transactional;

public interface ArticleService {
    // --- 前台用户功能 ---

    /**
     * 创建一篇新文章。
     * @param request 包含文章标题、内容、分类等信息的DTO
     * @param currentUser 当前登录的用户
     * @return 创建成功后持久化的Article实体
     */
    Article createArticle(CreateArticleDTO request, User currentUser);

    /**
     * 根据ID获取单篇文章的详细信息。
     * @param articleId 文章ID
     * @param currentUser 当前查看的用户（可以为null），用于判断点赞、收藏等状态
     * @return 包含完整内容和互动状态的文章详情DTO
     */
    ArticleDetailDTO getArticleById(Long articleId, User currentUser);

    /**
     * 分页获取所有已发布的文章列表。
     * @param pageable 分页和排序信息
     * @param currentUser 当前查看的用户（可以为null）
     * @return 分页后的文章摘要列表
     */
    Page<ArticleDetailDTO> getAllArticles(Pageable pageable, User currentUser);

    /**
     * 更新一篇已存在的文章。
     * @param articleId 要更新的文章ID
     * @param request 包含更新后信息的DTO
     * @param currentUser 执行操作的用户，必须是文章作者
     * @return 更新后的文章详情DTO
     */
    ArticleDetailDTO updateArticle(Long articleId, UpdateArticleDTO request, User currentUser);

    /**
     * 删除一篇自己的文章。
     * @param articleId 要删除的文章ID
     * @param currentUser 执行操作的用户，必须是文章作者
     */
    void deleteArticle(Long articleId, User currentUser);

    // --- 后台管理功能 ---

    /**
     * (管理员) 分页获取全站所有文章，包含更详细的管理信息。
     * @param pageable 分页和排序信息
     * @return 分页后的后台文章列表DTO
     */
    Page<AdminArticleDetailDTO> getAllArticlesForAdmin(Pageable pageable);

    /**
     * (管理员) 更新指定文章的状态。
     * @param articleId 文章ID
     * @param status 新的状态字符串 (例如 "HIDDEN", "PUBLISHED")
     */
    void updateArticleStatusByAdmin(Long articleId, String status);

    /**
     * (管理员) 强制删除指定文章。
     * @param articleId 要删除的文章ID
     */
    void deleteArticleByAdmin(Long articleId);
//    Article createArticle(CreateArticleDTO request, User currentUser);
//    ArticleDetailDTO getArticleById(Long articleId);
//    Page<ArticleDetailDTO> getAllArticles(Pageable pageable);
//    ArticleDetailDTO updateArticle(Long articleId, ArticleUpdateDTO request, User currentUser);
//////    void deleteArticle(Long articleId, User currentUser);
////    // === 新增后台管理接口方法 ===
////    Page<AdminArticleDetailDTO> getAllArticlesForAdmin(Pageable pageable);
////    void updateArticleStatusByAdmin(Long articleId, String status);
////    void deleteArticle(Long articleId, User currentUser); // 给普通用户用
////    void deleteArticleByAdmin(Long articleId); // 新增给管理员用的方法
//// --- 前台用户功能 ---
//Article createArticle(CreateArticleDTO request, User currentUser);
//
//    @Transactional(readOnly = true)
//    Page<ArticleDetailDTO> getAllArticles(Pageable pageable);
//
//    ArticleDetailDTO getArticleById(Long articleId, User currentUser);
//    Page<ArticleDetailDTO> getAllArticles(Pageable pageable, User currentUser);
////    ArticleDetailDTO updateArticle(Long articleId, UpdateArticleDTO request, User currentUser);
//    void deleteArticle(Long articleId, User currentUser);
//
//    // --- 后台管理功能 ---
//    Page<AdminArticleDetailDTO> getAllArticlesForAdmin(Pageable pageable);
//    void updateArticleStatusByAdmin(Long articleId, String status);
//    void deleteArticleByAdmin(Long articleId);
}